package cn.edu.tjnu.dao.impl;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import cn.edu.tjnu.dao.IUserInfoDao;
import cn.edu.tjnu.myUtils.MyUtils;
import cn.edu.tjnu.orm.ChargeBean;
import cn.edu.tjnu.orm.UsersBean;

public class UserInfoDaoImpl implements IUserInfoDao {

	/**
	 * 需要使用spring的依赖注入 sessionFactory对象
	 */
	private SessionFactory sessionFactory;

	@Override
	public int saveUserInfo(UsersBean userB) {
		// 保存
		Session session = sessionFactory.getCurrentSession();
		// 使用hibernate保存实体对象的数据
		session.saveOrUpdate(userB);
		return 1;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Override
	public List<UsersBean> getAllUserInfo(int orderById) {
		// 查询所有的用户信息
		// 保存
		Session session = sessionFactory.getCurrentSession();
		// 进行查询的hql语句
		String strHQL = "from UsersBean where isDeleted=0 ORDER BY userId ";
		// 倒序
		if (orderById == 0) {
			strHQL = "from UsersBean where isDeleted=0 ORDER BY userId  ";
		}
		// 1、获取query 对象
		Query query = session.createQuery(strHQL);

		// 2、获取查询结果
		List<UsersBean> lstUsers = query.list();
		return lstUsers;
	}

	@Override
	public List<UsersBean> queryAllUserInfoByParams(UsersBean userB) {
		// 进行条件查询
		// 获取session对象
		Session session = sessionFactory.getCurrentSession();
		// 构建条件查询的hql语句
		StringBuilder sb = new StringBuilder(
				"from UsersBean WHERE isDeleted=0 ");
		// 查询参数集合map
		Map<Object, Object> mapParams = new HashMap<Object, Object>();
		// 根据参数值拼写参数条件
		if (userB != null) {
			// 构建条件语句部分
			// 姓名 模糊查询
			if (MyUtils.isNotNullorEmpty(userB.getUserLogName())) {
				// 拼写查询条件
				sb.append(" and userLogName like :userLogName");
				// 添加查询参数
				mapParams
						.put("userLogName", "%" + userB.getUserLogName() + "%");
			}

			// 真实姓名 模糊查询
			if (MyUtils.isNotNullorEmpty(userB.getUserRealName())) {
				// 拼写查询条件
				sb.append(" and userRealName like :userRealName");
				// 添加查询参数
				mapParams.put("userRealName", "%" + userB.getUserRealName()
						+ "%");
			}

			// 起始年龄查询条件
			if (userB.getUserAge() > 0) {
				// 拼写查询条件
				sb.append(" and userAge >= :userAge");
				// 添加查询参数
				mapParams.put("userAge", userB.getUserAge());
			}

			// 截止年龄查询条件
			if (userB.getUserAge2() > 0) {
				// 拼写查询条件
				sb.append(" and userAge <= :userAge2");
				// 添加查询参数
				mapParams.put("userAge2", userB.getUserAge2());
			}

			// 性别查询条件
			if (MyUtils.isNotNullorEmpty(userB.getUserSex())) {
				// 拼写查询条件
				sb.append(" and userSex = :userSex");
				// 添加查询参数
				mapParams.put("userSex", userB.getUserSex().trim());
			}

			// 身份证号 模糊查询
			if (MyUtils.isNotNullorEmpty(userB.getUserIDCard())) {
				// 拼写查询条件
				sb.append(" and userIDCard like :userIDCard");
				// 添加查询参数
				mapParams.put("userIDCard", "%" + userB.getUserIDCard() + "%");
			}

			// 起始出生日期时间条件
			if (userB.getUserBirthday() != null) {
				// 拼写查询条件
				sb.append(" and DATE_FORMAT(userBirthday,'%Y-%m-%d') >= DATE_FORMAT(:userBirthday,'%Y-%m-%d')");
				// 添加查询参数
				mapParams.put("userBirthday", MyUtils.convertData2String(
						userB.getUserBirthday(), null));

			}
			// 截止出生日期时间条件
			if (userB.getUserBirthday2() != null) {
				// 拼写查询条件
				sb.append(" and DATE_FORMAT(userBirthday,'%Y-%m-%d') <= DATE_FORMAT(:userBirthday2,'%Y-%m-%d')");
				// 添加查询参数
				mapParams.put("userBirthday2", MyUtils.convertData2String(
						userB.getUserBirthday2(), null));

			}
			// 住址 模糊查询
			if (MyUtils.isNotNullorEmpty(userB.getUserAddress())) {
				// 拼写查询条件
				sb.append(" and userAddress like :userAddress");
				// 添加查询参数
				mapParams
						.put("userAddress", "%" + userB.getUserAddress() + "%");
			}
			// 住址 模糊查询
			if (MyUtils.isNotNullorEmpty(userB.getUserTel())) {
				// 拼写查询条件
				sb.append(" and userTel like :userTel");
				// 添加查询参数
				mapParams.put("userTel", "%" + userB.getUserTel() + "%");
			}
			// 角色查询条件
			if (MyUtils.isNotNullorEmpty(userB.getUserRoleName())) {
				// 拼写查询条件
				sb.append(" and userRoleName = :userRoleName");
				// 添加查询参数
				mapParams.put("userRoleName", userB.getUserRoleName().trim());
			}

		}
		// 1、获取query 对象
		Query query = session.createQuery(sb.toString());
		// 设置查询参数集合
		query.setProperties(mapParams);
		// 2、获取查询结果
		List<UsersBean> lstUsers = query.list();
		// 3、遍历结果集
		return lstUsers;
	}

	

	@Override
	public UsersBean queryUserInfoByUid(Integer uid) {
		// 获取session对象
		Session session = sessionFactory.getCurrentSession();
		// 根据用户id查询用户信息
		UsersBean userB = (UsersBean) session.get(UsersBean.class, uid);
		// 返回查询结果
		return userB;
	}

	@Override
	public int deleteUserInfoByUid(Integer uid) {
		// 获取session对象
		Session session = sessionFactory.getCurrentSession();
		/*
		 * // 根据用户id查询用户信息 UsersBean userB = (UsersBean)
		 * session.get(UsersBean.class, uid); // 更改标志位字段 userB.setIsDeleted(1);
		 * session.saveOrUpdate(userB);
		 */

		// 进行查询的hql语句
		String strHQL = "update UsersBean set isDeleted=1 where userId=" + uid;
		// 获取query 对象
		Query query = session.createQuery(strHQL);
		// 执行逻辑删除语句
		int i = query.executeUpdate();
		// 返回删除结果
		return i;
	}

}
